针对日志文件自身的攻击主要有哪些
对日志发起的攻击有三种:
有选择性的删除(修改)日志
我们知道Windows日志是以实体文件保存在磁盘上的,因此可以很容易的想到一个实现选择性修改或者删除日志的方式,既是通过修改文件内容来达到此目的。
要对日志文件进行修改,那么首先需要解决的问题是文件占坑,我们打开调试器之后可以很清楚的看到日志服务的对应的宿主进程为 Services.exe (NT6下为svchost.exe),所调用的动态链接库文件为 eventlog.dll(NT6下为 wevtsvc.dll) ,于是很自然的我们可以通过注入进程的方式来遍历打开的文件句柄,同时挂起动态链接库文件的操作线程,解决占坑之后就可以对日志文件进行删除与修改了。
介于NT5内核的系统已经退出历史舞台,这里也不再做过多讨论,有了结构体说明之后可以很容易的像操作其他二进制文件那样来操作日志文件。刚才说过NT6内核下直接有对应API来完成此日志的操作,所以通过查阅MSDN我们可以很方便的找到对应的API,或者通过读写XML文件的方式(自己解析结构稍微麻烦一点)来进行日志文件的修改。修改完成后保存即可,此后再恢复现场既实现了有选择性的日志删除或者修改。
阻止本地日志的产生
有很多情况下,攻陷了一台Windows终端之后,为了方便我们在此终端上进行的一些猥琐操作,我们不不希望被记录到,除了在事后对先前产生的日志进行有选择的篡改之外,我们还可以用更为粗暴的方式来阻止本地日志的产生。前面说过对于产生日志的主要服务是哪些,那么我们可以很容易的整理出如下思路来阻止本地日志的产生:
通过遍历进程找到日志服务对应的宿主进程PID
通过甄别加载的动态链接库文件找到对应的线程ID
非常暴力的干掉对应线程
至此,Windows Event Log 服务便失去了它原有的活力的,成为了哑巴。
对抗实时日志采集系统
现在越来越多的大型采用ELK架构(ElasticSearch + Logstash + Kibana),通常在Windows又会采用流行的nxlog作为日志采集的agent,那么一个常见的实时日志采集流程如下:
nxlog 使用模块 im_file 收集日志文件,开启位置记录功能
nxlog 使用模块tcp输出日志
logstash 使用input/tcp ,收集日志,输出至es
通过阅读源码可知 nxlog 的tcp通信 apr_socket_send 来发送数据,在Windows对应的动态链接库文件为libapr-1-0.dll,知晓了对应的函数,我们可以很容易的通过注入进程后Hook apr_socket_send 的函数来修改想要传送的数据包,从而达到欺骗实时日志采集系统的目的。
如果需要做得较为完美,可以通过 nxlog 的配置文件来获取其使用何种通道及文件格式来传输日志,针对不同类型的方式,在传输过程中进行Hook(如以上例子中TCP模式),或者在产生日志信息时进行Hook(如大部分情况下会Json)。